//


import UIKit
import SDWebImage
/*
1.需要解决的一个重要问题,就是如何去改变视图的宽高

图片1张的时候,我们可以返回一个item宽高,也可以返回 宽 = itemW * 3 + 2 * itemMargin ,高 itemH
2,3张图片 宽 = itemW * 3 + 2 * itemMargin ,高 itemH

4张图片, 宽 = itmeW * 2 + itemMargin 高 = 宽

5,6, 宽 = itemW * 3 + 2 * itemMargin ,高 (itemH + itemMarin)*2


7,8,9 宽 = itemW * 3 + 2 * itemMargin ,高 (itemH + itemMarin)*3


我们知道宽高 -- 什么去修改宽高?
当我们给 视图的Model赋值的时候,去修改,

1.数据--也就是接口文档
2.分析页面 -- 添加一个Label
3.实现功能 --

*/

//定义(相当于宏)常量的时候,最好把他定义在类外边
//定义一个间距
let ItemMargin:CGFloat = 10

let ItemWH = (UIScreen.mainScreen().bounds.width - 4 * ItemMargin)/3

//定义cell的重用标示
//定义一个cell重用表示
let CZPictureViewCollectionViewReuserIdentifer = "CZPictureViewCollectionViewReuserIdentifer"
class CZPictureView: UICollectionView,UICollectionViewDataSource {

    
    // 赋值的时候,知道已经计算好宽高,然后再更新约束
//    var pictureViewModel:CZStatusViewModel?{
//    
//        didSet{
//        
//            self.snp_updateConstraints { (make) -> Void in
//                
//                
//                let size = self.calPictureSize()
//                make.width.equalTo(size.width)
//                make.height.equalTo(size.height)
//            }
//            //赋值之后加载数据
//            reloadData()
//        }
//    
//    }
    
    //对外统一一个数组,这个数组,转发微博和原创微博都可以传递进来数据
    
    var pictureList:[CZPictureViewModel]?{
    
        didSet{
        
            self.snp_updateConstraints { (make) -> Void in
                
                let size = self.calPictureSize()
                make.width.equalTo(size.width)
                make.height.equalTo(size.height)

            }
            
            addSubview(label)
            
            //让测试的label居中显示
            label.snp_makeConstraints { (make) -> Void in
                make.center.equalTo(self.snp_center)
            }
            //赋值
            label.text = "\(pictureList?.count ?? 0 )"
            
            //赋值之后重新加载数据
            reloadData()
        }
    }
    //定义一个流水布局
    var flowLayout : UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    
    //init
    override init(frame: CGRect, collectionViewLayout layout: UICollectionViewLayout) {
        super.init(frame: frame, collectionViewLayout: flowLayout)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    
    //私有方法
    private func setupUI(){
        
         backgroundColor = UIColor.whiteColor()
        
        
        /*
        1.实现CollectionView的数据源方法
        2.设置 flowlayout 以及UICollectionView的属性
        3.显示图片 -- 自定义Cell
        */
        self.dataSource = self
        
        //注册cell
        self.registerClass(CZPictureViewCollectionCell.self, forCellWithReuseIdentifier: CZPictureViewCollectionViewReuserIdentifer)
        
        //设置滚动的方向
        //flowLayout.scrollDirection = UICollectionViewScrollDirection.Horizontal
        //设置cell的大小
        flowLayout.itemSize = CGSizeMake(ItemWH-1, ItemWH-1)
        flowLayout.minimumInteritemSpacing = ItemMargin
        flowLayout.minimumLineSpacing = ItemMargin
    
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
    }
    //懒加载
    // lazy var flowLayout1:UICollectionViewFlowLayout = UICollectionViewFlowLayout()
    //计算配图视图的宽高
    private func calPictureSize() -> CGSize{
        
        // 需要根据图片的个数
        let count = pictureList?.count //pictureViewModel?.statusModel?.pic_urls?.count
        
        print(count)
        
        //
        if count <= 3{
            
            //宽 = itemW * 3 + 2 * itemMargin ,
            //高 itemH
            return CGSizeMake(ItemWH * 3 + 2 * ItemMargin, ItemWH)
            
        } else if count == 4 {
            //4张图片, 宽 = itmeW * 2 + itemMargin 高 = 宽
            return CGSizeMake(ItemWH * 2 + ItemMargin, ItemWH * 2 + ItemMargin)
            
        } else {
            // 这里
            let row = CGFloat((count! - 1)/3 + 1)
            
            return CGSizeMake(UIScreen.mainScreen().bounds.width - 2 * ItemMargin, (ItemMargin + ItemWH)*row)
            //  5,6, 宽 = itemW * 3 + 2 * itemMargin ,高 itemH*2 + itemMargin
            
            
            // 7,8,9 宽 = itemW * 3 + 2 * itemMargin ,高 itemH*3 + 2 * itemMargin
            
        }
        
        
    }
    
    //添加一个测试label
    private lazy var label: UILabel = {
        
        let label = UILabel()
        
        return label
    }()
}


//代码模块化
extension CZPictureView{

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return pictureList?.count ?? 0
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
//        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CZPictureViewCollectionViewReuserIdentifer, forIndexPath: indexPath) as! CZPictureViewCollectionCell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(CZPictureViewCollectionViewReuserIdentifer, forIndexPath: indexPath) as! CZPictureViewCollectionCell
        cell.pictureViewModel = pictureList![indexPath.item]
        
        return cell
    }
}

class CZPictureViewCollectionCell:UICollectionViewCell{

    //数据传值.self.self()MVM
    var pictureViewModel:CZPictureViewModel?{
    
        didSet{
        
            
            let url = NSURL(string: pictureViewModel?.model?.thumbnail_pic ?? "")
            
            if let Ourl = url {
                
                iconImageView.sd_setImageWithURL(Ourl)
            }
        
        }
    
    }
    //自定义视图三部曲
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //私有方法
    private func setupUI(){
    
        addSubview(iconImageView)
        
        iconImageView.frame = self.bounds
    
    }
    
    //懒加载
    
    private lazy var iconImageView: UIImageView = {
        
        let img = UIImageView()
        
        return img
    }()
    
   
}
